/**
 * @Author Yenchingcheng
 * @Date 2023/6/2 10:49
 * @Description 抽象类--修建基础设施
 **/
public abstract class BuildInfrastructure {

    /**
     * 普通方法
     */
    protected void getInvestment(){

    }

    protected abstract void buildAbovegroundPart();

    protected abstract boolean isSubway();
    protected abstract void buildUndergroundPart();

    /**
     * 子类通用的方法
     */
    protected void run(){
        System.out.println("试运行。");
    };

    /**
     * 模板方法--final，防止篡改
     * 0.规定了方法执行的步骤和逻辑
     * 1.通过子类控制父类的方法（buildUndergroundPart()）是否实现
     * 2.子类不变的行为只进行一次编程，子类无需再动（run()）
     * 3.子类根据自身实际进行对别的方法进行扩展
     */
    public final void templateMethod(){
        this.getInvestment();
        this.buildAbovegroundPart();
        if(this.isSubway()){
            this.buildUndergroundPart();
        }
        this.run();
    }
}
